package com.wsllx.springboot.config;

import com.wsllx.springboot.interfac.WebServer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;

import java.util.Map;

/**
 * 启动类
 */
public class SpringApplication {
	/**
	 * 创建一个Spring容器
	 * 创建Tomcat对象
	 * 生成DispatcherServlet对象，并且和前面创建出来的Spring容器进行绑定
	 * 将DispatcherServlet添加到Tomcat中
	 * 启动Tomcat
	 *
	 * @param clazz
	 */
	public static void run(Class clazz) {
		//1.创建一个Spring容器
		AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();
		//通过传入的类来生产容器
		applicationContext.register(clazz);
		applicationContext.refresh();
		//启动tomcat
		WebServer webServer = getWebServer(applicationContext);
		webServer.start();
	}
	
	/**
	 * 获取WEB容器：tomcat
	 * @param applicationContext
	 * @return
	 */
	private static WebServer getWebServer(AnnotationConfigWebApplicationContext applicationContext) {
		//获取容器中的web服务对象
		Map<String, WebServer> beansOfType = applicationContext.getBeansOfType(WebServer.class);
		//为空，报错
		if (beansOfType.isEmpty()) {
			throw new NullPointerException("servlet容器为空");
		}
		//Jetty和tomcat同时存在也报错
		if (beansOfType.size() > 1) {
			throw new IllegalStateException("servlet容器不能同时出现多个");
		}
		//返回唯一网络服务
		return beansOfType.values().stream().findFirst().get();
	}

}
